package com.framework.controller.auth;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.framework.dto.UserLoginDTO;
import com.framework.entity.Menu;
import com.framework.entity.Role;
import com.framework.entity.RoleMenu;
import com.framework.entity.UserRole;
import com.framework.service.*;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.Objects;
import java.util.UUID;

/**
 * @Description: 登录鉴权接口
 * @author: 姚佳飞
 * @createTime: 2023/12/10 15:36
 */

@RestController
@RequestMapping("/auth/")
@RequiredArgsConstructor
public class AuthController {

    private final UserService userService;

    private final MenuService menuService;

    private final RoleService roleService;

    private final RoleMenuService roleMenuService;

    private final UserRoleService userRoleService;

    /**
     * 检查用户是否登录
     */
    @GetMapping("doLogin")
    public SaResult isLogin(){
        return SaResult.ok("登录状态:" + StpUtil.isLogin());
    }

    /**
     * 退出登录
     */
    @GetMapping("logout")
    public SaResult logout(){
        StpUtil.logout();
        return SaResult.ok();
    }

    /**
     * 用户登录
     *
     *  @param userLoginDTO 登录的用户名和密码
     */
    @PostMapping("login")
    public SaResult login(@RequestBody UserLoginDTO userLoginDTO){
        String account = userLoginDTO.getAccount();
        String ps = userLoginDTO.getPs();
        UUID userId = userService.getAccountId(account, ps);
        if (Objects.isNull(userId)){
            return SaResult.error("登陆失败，请检查用户名和密码是否正确");
        }
        StpUtil.login(userId);
        // 发起session会话，存储当前登录唯一标识符，用于获取登录用户身份信息
        SaSession session = StpUtil.getSession();
        session.set("userId",userId);
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        return SaResult.data(tokenInfo);
    }

    /**
 * 添加菜单
 * @param menu 菜单对象
 * @return SaResult 结果对象
 */
@PostMapping("addMenu")
public SaResult addMenu(@RequestBody Menu menu){
    // 检查传入的path是否为空
    if (Objects.isNull(menu.getPath())){
        return SaResult.error("传入path参数为空");
    }
    // 调用service保存菜单
    return menuService.saveMenu(menu);
}

    /**
     * 添加角色
     * @param role 角色对象
     * @return SaResult 返回结果对象
     */
    @PostMapping("addRole")
    public SaResult addRole(@RequestBody Role role){
        // 检查name参数是否为空
        if (Objects.isNull(role.getName())){
            return SaResult.error("传入name参数为空");
        }
        // 保存角色
        return roleService.saveRole(role);
    }

    /**
     * 添加用户角色
     * @param userRole 用户角色对象
     * @return SaResult 返回结果对象
     */
    @PostMapping("addUserRole")
    public SaResult addUserRole(@RequestBody UserRole userRole){
        // 检查userId和rolesId参数是否为空
        if (Objects.isNull(userRole.getUserId()) || Objects.isNull(userRole.getRoleId())){
            return SaResult.error("传入userId或roleId参数为空");
        }
        // 保存用户角色
        return userRoleService.saveUserRole(userRole);
    }

    /**
     * 添加角色菜单
     * @param roleMenu 角色菜单对象
     * @return SaResult 返回结果对象
     */
    @PostMapping("addRoleMenu")
    public SaResult addRoleMenu(@RequestBody RoleMenu roleMenu){
        // 检查rolesId和menuId参数是否为空
        if (Objects.isNull(roleMenu.getRoleId()) || Objects.isNull(roleMenu.getMenuId())){
            return SaResult.error("传入menuId或roleId参数为空");
        }
        // 保存角色菜单
        return roleMenuService.saveRoleMenu(roleMenu);
    }

}
